home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Zomo's Site / iwan6.rar.txt / iwan_tut6.txt < prev   
Text File  |  1999-07-02  |  13KB  |  238 lines

  1. ____________________________________________________________________________________                                                          
  2.                     _________\          |            __________  
  3.                    /          \      __-+-  __      |         /\ 
  4.                   /___________/     /'( |_  )`\     |________/  \
  5.                  |   \       /     / . \/^\/ . \            /   /
  6.                   \   \           /  _)_`-'_(_  \          /   / 
  7.                    \   \         /.-~   ).(   ~-.\        /   /  
  8.                     \   \       /'     /\_/\     `\      /   /   
  9.                      \  /     __  ___  " __"  __  _ _  \/   /    
  10.                       \/     / _)(  ,)  (  ) / _)( ) )  \__/_    
  11.                             ( (_  )  \  /()\( (_  )  \           
  12.                              \__)(_)\_)(_)(_)\__)(_)\_)          
  13.                                 ___             __               
  14.                                (  ,\o l a n d  (  )              
  15.                                 ) _/ cRACKING   )(__             
  16.                                (_)      gROUP  (____)            
  17.                                     ____     /\                  
  18.                                    /  \     /  \                 
  19.                                   /\   \   /   /                 
  20.                                     \   \ /   /                  
  21.                                      \___\___/                   
  22. _______________________________________________________________________________________
  23.  
  24.                                 CrackPl prezentuje 
  25.                 iwan's tutorial#6
  26. _______________________________________________________________________________________
  27.  
  28. Cel: Windows Commander 4.0
  29. Skad: http://www.ghisler.com/
  30. Rozmiar: 1,33 MB
  31. Czym: Softice, Hiew
  32. --------------------------------------------------------------------------------------
  33. Wstep:
  34. Program ten jest tzw. managerem plikow i przypomina DOSowego Norton Commandera. Jest bardzo 'konfigurowalny' i doskonale zastepuje win explorera. 
  35. --------------------------------------------------------------------------------------
  36. Note: najlepij czyta sie uzywajac Courier New 10.
  37.  
  38.  
  39.  
  40. Opis:
  41.  
  42.  Zabezpieczenie programu jest na tyle ciekawe, ze warto sie nim zajac :-) Wstepne zapoznanie sie z celem prowadzi do kilku wnioskow:
  43. - podczas uruchamiania pojawia sie okropny nag-screen z wielkim napisem 'NOT REGISTERED' i trzema przyciskami, z ktorych tylko jeden (losowo wybrany) pozwala uruchomic program,
  44. - po trafieniu w porzadany przycisk, obok nazwy programu, widzimy rownie piekny napis 'NOT REGISTERED',
  45. - nigdzie nie mozemy znalezc okienka rejestracyjnego, czyli zabezpieczenie najpradopodobniej oparte jest na brakujacym pliku. 
  46.  
  47.  Jak sie zaraz okaze, uporanie sie z powyzszymi problemami ;-) nie jest az tak ciezkie. Klopot pojawia sie jednak, gdy chcemy wprowadzic jakies zmiany w wincmd32.exe. Wtedy to pojawia sie ostrzezenie, ze plik zostal zaifekowany i program konczy swoje dzialanie :-(. Calkiem ciekawie :-0.
  48.  
  49.  Wrocmy jednak do naszego brakujacego pliku. Sprobujmy sprawdzic, czy nasze przypuszczenia byly sluszne. W SI zakladamymy wiec pulapke:
  50.  
  51. bpx CreateFileA do "d esp->4; p ret;"
  52.  
  53. i uruchamiamy wincmd32.exe. Jak zaraz zobaczymy, najpierw otwarty zostanie plik wincmd32.exe (wow!), a po kilku kolejnych zatrzymaniach dojdziemy do momentu, w ktorym otwrty zostac ma plik wincmd.key. Tak, to bez watpienia nasz brakujacy plik! Od razu jednak zaznaczam, ze nie bede sie staral dojsc do tego, co w nim sie powinno znalezc, bo jest to zakrecone jak sloiki z dzemem mojej babci. Jezeli jednak komus uda sie rozpracowac sposob kodowania danych w wincmd.key, niech do mnie napisze (iwy@friko.onet.pl).
  54.  
  55.  OK, przejdzmy wiec do konkretow. Nasza pulapka zatrzymala wykonywanie programu w momencie proby otwarcia wincmd.key:
  56.  
  57. :00442148 Call KERNEL32!CreateFileA
  58. :0044214D mov dword ptr [ebp-1C], eax <-- TUTAJ!
  59. :00442150 cmp dword ptr [ebp-1C], FFFFFFFF
  60. :00442154 jnz 0044216C
  61. :00442156 call 00403508
  62. :0044215B lea eax, dword ptr [eax+0000000C]
  63. :00442161 push eax
  64.  
  65. Skok w :00442154 nie zostaje wykonany, poniewaz eax=-1 (nie ma pliku, wiec -1 trafia do eax). Jedziemy wiec dalej, az do momentu, gdy skok:
  66.  
  67. :004BED99 jnz 004BEDBC
  68.  
  69. doprowadza nas do fragmentu:
  70.  
  71. :004BEDBC xor ebx, ebx
  72. :004BEDBE mov [ebp-1E], 0000
  73. :004BEDC7 cmp word ptr [ebp-1E], 0080
  74. :004BEDD0 setz byte ptr [005181FD]
  75.  
  76. W drugiej linijce tego fragmentu 0 oznacza, ze nie ma pliku wincmd.key. Porownanie linijke nizej sprawdza, czy plik istnieje (odwoluje sie do niej skok z linii :004BEDBA) i jezeli istnieje, ustawiana jest flaga zerowa pod adresem [005187FD]. Idzmy wiec dalej tym tropem. Zlikwidujmy nasza aktywna pulapke i zalozmy nowa, ktora pilnowac bede naszej flagi zerowej:
  77.  
  78. bpm 5187FD rw
  79.  
  80. F5 doprowadzi nas do:
  81.  
  82. :004BEDD7 test bl, bl
  83. :004BEDDE je 004BF0D0
  84.  
  85. a wiec do dalszej czesci powyzszego kodu. Jeszcze raz F5 i:
  86.  
  87.       :004BF714 mov al, byte ptr [005187FD]
  88.     :004BF719 ret
  89.  
  90.     ...powrot z funkcji...
  91.  
  92. :004BCD85 test al, al
  93. :004BCD87 jz 004BCDC9
  94.  
  95.     ...skok do...
  96.  
  97.      :004BCDC9 call 004BF70C
  98.  
  99.          ...wywolanie...
  100.  
  101.             :004BF70C mov al, byte ptr [005187FC]
  102.         :004BF711 ret
  103.  
  104.  
  105.          ...powrot z funkcji...
  106.  
  107.       :004BCDCE test al, al
  108.     :004BCDD0 jz 004BCDF8 
  109.  
  110. No, ale zamieszanie! Sprobujmy jednak przanalizowac to ze spokojem. W al nie pojawia sie 1, wiec skok pod :004BCD87 zostaje wykonany (nie ma wincmd.key). Dochodzimy wiec do funkcji, ktora powoduje skopiowanie 0 do al (flaga zerowa nie zostala przeciez ustawiona). Dlatego tez skok pod :004BCDD0 zostaje wykonany. A za co on odpowiada? Tak, za pojawienie sie nag-screen'a, a wlasciwie jego niemilej wersji (jak sie pozniej okaze pojawia sie in na moment rowniez po zarejstrowaniu programu tyle, ze bez przyciskow i z napisem 'iwan / CrackPL'.
  111.  
  112. Aby wiec nie zobaczyc nag-screen'a, bedac w linii :004BCDCE mozemy napisac:
  113.  
  114. R eip=004BCDD2
  115.  
  116. F5 i... nagscreen przeskoczony. Pozniej usuniemy skok w :004BCDD0, warto wiec go zapamietac (offset BC1D0).
  117.  
  118. Czas teraz zabrac sie za 'NOT REGISTERED'. Szybko zauwazymy, ze nie mozna go w zaden sposob znalezc przy uzyciu hiew. Ani kawalka 'NOT REGISTERED', 'N O T   R E G I S T E R E D' ani zadnej innej kombinacji. Na tak, pewno jest jakos zakodowany :-0. Szukamy wiec w pamieci wszystkich sladow tego ciagu:
  119.  
  120. S 30:0 l ffffffff 'NOT REG'
  121.  
  122. Jako, ze pojawia sie on kilka razy, musimy cierpliwe pozakladac kilka BPR. U mnie owocny okazal sie jeden:
  123.  
  124. BPR 30:00C02178 30:00C02185 RW
  125.  
  126. ktory to doprowadzil mnie do call'a wywolujacego taki fragment:
  127.  
  128. :00409B98 mov edx, eax
  129. :00409B9A jmp 00409BAF
  130. :00409B9C cmp cl, 0A  <-----------
  131. :00409B9F je 00409BAE            |
  132. :00409BA1 mov cl, byte ptr [edx] |
  133. :00409BA3 sub cl, 20             |
  134. :00409BA6 xor cl, 77             |
  135. :00409BA9 add cl, 20             |
  136. :00409BAC mov byte ptr [edx], cl |
  137. :00409BAE inc edx                |
  138. :00409BAF mov cl, byte ptr [edx] |
  139. :00409BB1 test cl, cl            |
  140. :00409BB3 jne 00409B9C -----------
  141. :00409BB5 ret
  142.  
  143. Coz, jak widac nie jest to nic innego, jak intereujaca nas procedura szyfrujaca. Z EDX kopiowane sa kolejne znaki ciagu 'NOT REGISTERED' i po zaszyfrowaniu wracaja na swoje miejsce. Samo szyfrowanie jest proste - od wartosci hex znaku odejmowane jest 20, wynik XORowany jest z 77 i zsumowany z 20. Jezeli wiec ciag 'NOT REGISTERED' chcemy zastapic przez 'iwan / CrackPL', musimy go zakodowac w ten sam sposob. Ostatecznie zmienimy wiec ciag:
  144.  
  145. 79 78 63 97 65 72 70 7E 64 63 72 65 72 73
  146.  
  147. na:
  148.  
  149. 5E 40 56 59 97 98 97 74 45 56 54 5C 67 7B
  150.  
  151. Pomoze nam w tym oczywi£cie Hiew ;-)
  152.  
  153.  OK, pieknie - nie mamy juz nag-screen'a, napisu 'NOT REGISTERED', ktorego miejsce zajela nasza ksywa :-). Pozostal jeszcze tylko jeden maly problem - komunikat o wirusie:
  154. "WARNING: The WINCMD executable file is corrupted, possible VIRUS! Wincmd will close. Please run a virus scanner as soon as possible!"
  155.  
  156. Ok, wrocmy wiec do poczatku naszej analizy. Ustawiamy wiec:
  157.  
  158. bpx CreateFileA do "d esp->4; p ret;"
  159.  
  160. jeszcze raz. Analize kodu rozpoczynamy, gdy wyladujemy w kodzie programu w momencie otwarcia pliku windcm32.exe (juz po pojawieniu sie zmodyfikowanego nag-screen'a). Cierpliwa analiza doprowadza nas do tekiego fragmentu kodu:
  161.  
  162. :0044F042 xor ecx, ecx
  163. :0044F044 mov cl, byte ptr [edi]
  164. :0044F046 add eax, ecx
  165. :0044F048 add edx, eax
  166. :0044F04A inc edi
  167. :0044F04B dec esi
  168. :0044F04C jne 0044F044
  169. :0044F04E mov dword ptr [ebp-04], eax
  170. :0044F051 mov dword ptr [ebp-08], edx
  171. :0044F054 pop esi
  172. :0044F055 pop edi
  173. :0044F056 mov eax, dword ptr [edi]
  174. :0044F058 add dword ptr [ebp-0C], eax
  175. :0044F05B mov eax, dword ptr [ebp-04]
  176. :0044F05E mov ecx, 0000FFF1
  177. :0044F063 cdq
  178. :0044F064 idiv ecx
  179. :0044F066 mov dword ptr [ebp-04], edx
  180. :0044F069 mov eax, dword ptr [ebp-08]
  181. :0044F06C mov ecx, 0000FFF1
  182. :0044F071 cdq
  183. :0044F072 idiv ecx
  184. :0044F074 mov dword ptr [ebp-08], edx
  185. :0044F077 test ebx, ebx
  186. :0044F079 jg 0044F01C
  187. :0044F07B mov eax, dword ptr [ebp-08]
  188. :0044F07E shl eax, 10
  189. :0044F081 or eax, dword ptr [ebp-04]
  190. :0044F084 mov dword ptr [esi], eax
  191.  
  192. Ten fragment kodu odpowiada za obliczenie tzw. checksum, ktora ostatecznie laduje pod adresem wskazywanym przez esi (w tym przypadku jest to 006DF93C). Analize samego sposobu liczenia checksum pozostawiam dociekliwym, ja w tym tutorialu nie bede sie tym zajmowal, bo nie jest to potrzebne :-) (jezeli bardzo Ci zalezy, napisz do mnie, to podpowiem). W tym momencie najwazniejsze, ze wiemy, gdzie checksum jest zapisywana. Zalozmy wiec pulapke na dostepie do pamieci w tym miejscu, usuwajac wczesniej poprzednie pulapki:
  193.  
  194. bpmd 157:006DF93C rw
  195.  
  196. Po wyjsciu z petli dochodzimy w koncu do miejsca, w ktorym nasza checksum jest XORowana z wartoscia F5A3E289 i zapisana w eax. Nastepnie jest ona porownywana z prawidlowa wartoscia (czyli taka, jaka powinna byc, gdyby w pliku nie zostaly dokonane zadne zmiany):
  197.  
  198. :0045024A mov eax, dword ptr [ebp+08]
  199. :0045024D xor dword ptr [eax-04], F5A3E289
  200. :00450254 push ebp
  201. :00450255 call 00450114
  202. ...i po wywolaniu...  
  203. :00450114 push ebp
  204. :00450115 mov ebp, esp
  205. :00450117 mov eax, dword ptr [ebp+08]
  206. :0045011A mov eax, dword ptr [eax+08]
  207. :0045011D mov eax, dword ptr [eax-04]
  208. :00450120 mov edx, dword ptr [ebp+08]
  209. :00450123 mov edx, dword ptr [edx+08]
  210. :00450126 cmp eax, dword ptr [edx-08]
  211. :00450129 setz al
  212. :0045012C call 004092A0
  213.  
  214.  
  215. Po porownaniu, w przypadku, gdy wartosci sa rowne, w al laduje 1. W przypadku tego programu nie wystarczy jednak zwykla zmiana setz na setnz. Problem porownania rozwiazac trzeba wczesniej. Wartosc w EAX to checksuma wyliczona z na podstawie naszego pliku. Wartosc pod adresem wskazywanym przez [EDX-8] to checksuma oczekiwana (czyli taka, jaka powinna zostac wyliczona, gdyby w pliku nie dokonano zadnych zmian). Musimy zrobic cos, by suma wyliczona rowna by│a sumie oczekiwanej. Jak zawsze rozwiazan jest wiele, rozne ich kombinacje pozostawiam twojwj wyobrazni. Ja zaproponuje jedno. Zatrzymajmy siΩ na chwile w linii :00450126, tuz przed porownaniem obu checksum. Spojrz na EAX. Wartosc w EAX, czyli checksuma wyliczona, bedzie w kazdym przypadku inna (w zaleznosci od wprowadzonych zmian). Wartosc oczekiwana (d edx-8) wyniesie jednak zawsze tyle samo, czyli D3670CA6. Fajnie by bylo, gdyby w EAX znajdowala siΩ wlasnie taka wartosc. Zaden problem. Spojrz na linie :0045024D. Tutaj dokona zostaje ostateczne wyliczenie naszej checksumy (dotychczasowa XORowana jest z wartoscia F5A3E289). Czemu wiec nie zmienic tej linii z:
  216.  
  217. xor dword ptr [eax-04], F5A3E289
  218.  
  219. na:
  220.  
  221. mov dword ptr [eax-04], D3670CA6
  222.  
  223. (w hex zamieniamy - pod offsetem 4F64D - 8170FC89E2A3F5 na C740FCA60C67D3).
  224.  
  225. Po tym zabiegu checksumy bΩd╣ sobie rowne! 
  226. Zrobione. Mysle, ze teraz usuniecie 'Please register!' z okienka na poczatku i z helpa bedzie tylko formalnoscia.
  227.  
  228. Jezeli cos jest dla ciebie nadal niejasne, przeczytaj tutorial jeszcze raz, jesli to nie pomoze - napisz do mnie.
  229.  
  230. --------------------------------------------------------------------------------------
  231. Jezeli szukasz tu jedynie seriali, to zle trafiles.
  232. Dzialania opisane powyzej maja na celu analize kodu programu i poznanie schematu jego
  233. zabezpieczenia. Jezeli masz zamiar uzywac tego programu dluzej, kup go (nie dotyczy M$).
  234. Pozwoli to producentom udoskonalac oferowane programy, jak rowniez ich zabezpieczenia.
  235. --------------------------------------------------------------------------------------
  236. 01/07/99 by iwan (iwy@friko.onet.pl)
  237.  
  238.